<?php

// 修改变量
$var1 = 1;
$var1 = 2;
echo '<hr/>', $var1;

// 删除变量
unset($var1);
//echo $var1;

// 变量命名规则
/**
 * 1. PHP 中变量名字必须以 $ 符号开始
 * 2. 名字由字母、数字、下划线 "_" 构成，但是不能以数字开头
 * 3. 可以使用 中文变量  ( 不推荐
 *
 *  正确格式:
 *      $var_1; $var_var_1; $_var1;
 *      $烂科人 = "lankeren";
 *  错误:
 *      $1var;
 */

// 预定义变量
/**
 *  预定义变量： 提前定义的变量，系统定义的变量，存储许多需要用到的数据
 * （ 预定义变量都是数组
 *
 * $_GET;   获取所有表单以 get 方式提交的数据
 * $_POST;  POST 提交的数据都会保存在此
 * S_REQUEST:  GET 和 POST 提交的都会保存
 * $GLOBALS:  PHP中所有的全局变量
 * $_SERVER;  服务器信息
 * $_SESSION; session 会话数据
 * $_COOKIE  cookie 会话数据
 * $_ENV   环境信息
 * $_FILES  用户上传的文件信息
 */

// 非常常用的有
//$_GET;
//$_POST;
//S_REQUEST;
//$_SERVER;
//$_SESSION;
//$_COOKIE;


//可变变量
/**
 *  可变变量
 * 如果一个变量保存的值刚好是另外一个变量的名字，那么可以直接通过访问一个
 * 变量得到另外一个变量的值，在变量前面再多加一个 $ 符号
 */

$a = 'b';
$b = 'bb';
echo $$a; // --> bb
// 找到 $a , 解析结果： b
// 将前面解析的结果与$ 绑定
// 变成了 $b -->  'bb'



// 变量传值
/**
 *  将一个变量赋值给另外一个变量，变量传值
 *
 * 变量传值一共有两种方式： 值传递，引用传递
 *
 * 值传递： 将变量保存的值赋值一份，然后将新的值给另外一个变量保存（两个变量没有关系）
 * 引用传递： 将变量保存的值所在的内存地址，传递给另外一个变量； 两个变量指向同
 * 一块内存空间（两个变量是同一个值）
 *
 */


// 在内存中， 通常有以下几个分区
/**
 *  栈区：  程序可以操作的内存部分（不存数据，运行程序代码），少但是快
 * 代码段：  存储程序的内存部分（不执行代码）
 * 数据段： 存储普通数据（全局区 和 静态区）
 *
 * 堆区： 存储复杂数据， 大、效率低
 */
$a = 1;
$b = 2;
$a = $b;  // 值传递

$b = 1;
echo $a,$b;  // 2  1

/**
 *  1. 代码装载： 从脚本文件中将代码读取出来，进行编译，将编译的结果存放
 * 到代码段中（字节码）
 * 2. 代码执行
 * 3. 脚本执行结束
 */

// 感觉这里有点像 c 语言？？


// 常量
/**
 *  常量与变量一样， 都是用来保存数据的
 *
 * 在 PHP 中常量有两种定义方式 （5.3之后才有两种的）
 * 1. 使用函数  define('常量名', 常量值);
 * 2. 5.3 之后才有的 const 常量名 = 常量值;
 */

// 使用函数定义常量: define
define("常量名","常量值");

// 使用 const
const changliangming = '常量值';


// 常量的命名规则
/**
 * 1. 常量不需要使用 $ 符号， 一旦使用系统就会认为是变量
 * 2. 常量的名字组成由字母、数字和下划线组成，蹦年以数字开头
 * 3. 常量的名字通常是以大写字母为主（与变量区别）
 * 4. 常量命名的规则比变量要松散，可以使用一些特殊字符，该方式只能使用 define 定义
 *
 */

// 定义特殊常量
define('-_-','smile');  // 只能用 define

// 注意细节
/**
 * 1. Define 和 const 定义的常量是有区别，在于访问权限区别
 * 2. 定义常量通常不区分大小写，但是可以区分，可以参照 define 的第三个参数
 *
 * 常量的使用和变量一样，不可改变值（在定义的时候赋值）
 */

// 使用常量
define('PI',3.14);
echo  PI;
// 对特殊名字的常量，需要用到另外一个访问常量的函数:
// constant('常量名')
echo constant('-_-');


// 说明
/**
 * 1、凡是数据 会可能变化的，那么肯定是用变量.
 * 2、数据不- 定会变的，可以使用常量或者变量(变量居多)
 * 3. 常量 不能 unset 掉
 * 4. 数据不允许被修改，一定用 常量
 */



// 系统常量
/**
 * 系统帮助用户定义的常量，用户可以直接使用
 *
 * 常用的几个系统常量
 * PHP_VERSION : PHP 版本号
 * PHP_INT_SIZE : 整型的大小
 * PHP_INT_MAX :  整型能表示的最大值
 *
 *
 */

echo '<hr/>', PHP_VERSION,'<br/>',PHP_INT_SIZE,'<br/>',PHP_INT_MAX;

// PHP中 允许出现负数的



// PHP 中还有一些特殊的常量
// 它们由双下划线开始 + 常量名 + 双下划线结束， 这种常量称之为
// 系统魔术常量：  魔术常量的值通常会跟着环境变化，但是用户改变不了
/**
 * __DIR__ ： 当前被执行的脚本所在的电脑的绝对路径
 * __FILE__ ： 当前被执行的脚本的所在电脑的绝对路径 （带自己文件的名字）
 * __LINE__ ： 当前所属的行数
 * __NAMESPACE__ ： 当前所属的命名空间
 * __CLASS__  : 当前所属的类
 * __METHOD__ ： 当前所属的方法
 *
 */

echo '<hr/>';
echo __DIR__,'<br/>',__FILE__,'<br/>',__LINE__,'<br/>';
echo __LINE__;



// PHP 中的数据类型
/**
 *  数据类型： data type， 在 PHP 中指的是存储的数据本身的类型
 * 而不是变量的类型
 * PHP 是一种弱类型语言，变量本身没有数据类型
 *
 */

// PHP 中的 八种数据类型
/**
 *  三大类、八小类
 * 简单（基本）数据类型
 *
 * 整型： int/integer ， 系统分配 4 个字节，表示整数类型(有前提的)
 * 浮点型： float/double 系统分配 8 个字节， 表示小数或者整型存不下的整数
 * 字符串型： string， 系统根据实际长度分配， 表示字符串（引号）
 * 布尔类型： bool/boolean， 表示布尔类型， 只有两个值， true/ false
 *
 * 复合类型： 2 个小类
 * 对象类型： object 存放对象
 * 数据类型： array， 存储多个数据（一次性）
 *
 * 特殊数据类型： 2个小类
 * 资源类型： resource 存放资源数据（PHP 外部数据，如数据库、文件）
 * 空类型 NULL ， 只有一个值就是 NULL （不能运算）
 *
 */



// 类型的转换
/**
 * 类型转换： 在很多的条件下，需要指定的数据类型
 *
 * 在PHP中有两种类型转换方式:。
 * 1、自动转换:系統根据需求自己判定，自己转换(用的比较多，效率偏低)。
 * 2、强制(手动)转换:认为根据需要的目标类型转换
 *   强制转换规则:在变量之前增加一一个括号()， 然后在里面写上对应类型:
 *
 * 在转换过程中，用的比较多的就是转布尔类型(判断)和转数值类型(算术运算)
 *
 *
 *
 *  其他类型转布尔类型:true或者false,在PHP中比较少类型换变成false
 *  （ ↑ 百度
 */

// 其他类型转数值的说明。
// 1、布尔true为1，false 为0;。
// 2、字符串转数值有自己的规则。
// 2.1以字母开头的字符串，永远为0;。
// .2以数字开头的字符串，取到碰到字符串为止(不会同时包含两个小数点)

// 创建数据
$a = 'abc1.1.1';
$b = '1.1.1abc';

// 自动转换
echo $a + $b;  // 算术 + 运算， 系统先转换成数值，再运算

// 强制转换
echo '<br/>',(float)$a,(float)$b;




// 类型判断
/**
 *  通过一组类型判断函数，来判断变量，最终返回这个变量所保存数据类型，
 * 是一组以is_ 开头后面跟类型名字的函数； is_xxx(变量名)
 *   (相同结果为true,失败为false)
 *
 * Bool类型不能用 echo 来查看（因为分不清是 字符串的 true 还是 bool 的 true），可以使用 var_dump 结构查看
 */

echo '<br/>';
echo is_double(12.000);  // 1
echo '<br/>';
var_dump(is_double(12.0000));  // bool(true)
var_dump(is_string($a));


/**
 *  还有一组函数可以用来获取以及设定数据（变量） 的类型
 * Gettype(变量名)， 获取类型，得到的是该类型对应的字符串
 * Settype(变量名，类型)  设定数据类型， 与强制转换不同
 *
 * 1. 强制转换（类型） 变量名
 * 是对数据值复制的内容进行处理（不会处理实际存储的内容）
 *
 * 2. settype 会直接改变数据本身
 */

echo '<br/>';

echo gettype($a);

// 设置类型
var_dump(settype($b,'int'));

echo $b;







